package vf1.so;

import java.net.InetAddress;
import java.net.MalformedURLException;
import java.net.UnknownHostException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;
import java.util.List;

import vf2.so.VF2_SO_IServidorRMI;


   public class VF1_SO_ClienteRMI extends UnicastRemoteObject implements VF1_SO_IClienteRMI {
	private static final long serialVersionUID = 1L;
	private static VF2_SO_IServidorRMI servidorRemoto;
	protected VF1_SO_ClienteRMI() throws RemoteException {
		super();
	}


	/** metodos de acesso **/

	public static VF2_SO_IServidorRMI getServidorRemoto() {
		return servidorRemoto;
	}
	public static void setServidorRemoto(VF2_SO_IServidorRMI servidorRemoto) {
		VF1_SO_ClienteRMI.servidorRemoto = servidorRemoto;
	}


	/** metodos de conectividade **/

	public void iniciarClienteRMI(boolean isClientNotAServer)
	throws UnknownHostException, MalformedURLException, RemoteException {

		if(isClientNotAServer){
			LocateRegistry.createRegistry(6660);
		}
		String urlCliente = "//" + InetAddress.getLocalHost().getHostAddress() + ":6660//BattleFieldTacticsCliente";
		System.out.printf("%s",urlCliente);
		Naming.rebind(urlCliente, new VF1_SO_ClienteRMI());
		System.out.printf("RMI do Cliente iniciado");
	}

	public void finalizarClienteRMI() {
		try {
			Naming.unbind("//localhost:6660//BattleFieldTacticsCliente");
			String servs[] = Naming.list("//localhost:6660//BattleFieldTactics");
			for (int s = 0; s < servs.length; s++) {
				System.err.println(servs[s]);
			}
			//return true;
		} catch (RemoteException ex) {
			//tratar
		} catch (NotBoundException ex) {
			//tratar
		} catch (MalformedURLException ex) {
			//tratar
		}
		//return false;
		System.out.printf("RMI do Cliente Finalizado");
	}

	public static VF2_SO_IServidorRMI criaServidor(String url) throws NotBoundException, MalformedURLException, RemoteException {
		setServidorRemoto((VF2_SO_IServidorRMI) Naming.lookup(url));
		return getServidorRemoto();
	}


	/** metodos diversos **/

	public void iniciarTelaEspera() throws RemoteException {
		System.out.printf("Tela Espera");
	}


	@Override
	public void atualizarPosicaoPersonagem(String jogador, int id_personagem,int posicao_x,int posicao_y) throws RemoteException {
		// TODO Auto-generated method stub
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		cliente.getTela_batalha().getBatalha().atualizarPosicao(jogador, id_personagem, posicao_x, posicao_y);

	}


	@Override
	public void atualizarStatusPersonagem(String jogador, int id_personagem,int status) throws RemoteException {
		// TODO Auto-generated method stub
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		cliente.getTela_batalha().getBatalha().atualizarStatus(jogador,id_personagem, status);
		if(id_personagem==1)
		System.out.printf("os ponto de vida da barbara do jogador %s eh: %d",jogador,status);
		if(id_personagem==2)
			System.out.printf("os ponto de vida da guerreira do jogador %s eh: %d",jogador,status);
		if(id_personagem==3)
			System.out.printf("os ponto de vida da ninja do jogador %s eh: %d",jogador,status);
}


	@Override
	public void desconectar() throws RemoteException {
		// TODO Auto-generated method stub

	}


	@Override
	public void finalizarBatalha(String vencedor) throws RemoteException {
		// TODO Auto-generated method stub
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		cliente.getTela_batalha().finalizarTela(vencedor);		
		
	}


	@Override
	public void finalizarTurno(int id) throws RemoteException {
		// TODO Auto-generated method stub
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		cliente.getTela_batalha().desabilitarBotaoAtacar();		
		cliente.getTela_batalha().desabilitarBotaoMover();		
	}


	@Override
	public void iniciarBatalha(List<String> nomes_jogadores) throws RemoteException {
		VF1_SO_BFTCliente cliente= VF1_SO_BFTCliente.getCliente();		
		cliente.iniciarTelaBatalha(nomes_jogadores);
		//cliente.getTela_espera().getFrame().dispose();
	}


	@Override
	public void permitirAtaque(int id) throws RemoteException {
		// TODO Auto-generated method stub
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		cliente.getTela_batalha().habilitarBotaoAtacar(id);
	}


	@Override
	public void permitirMovimento(int id) throws RemoteException {
		// TODO Auto-generated method stub
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		System.out.printf("\nO id no permitirMovimento é: %d\n",id);
		cliente.getTela_batalha().habilitarBotaoMover(id);		
	}


	@Override
	public void receberListaEspera(List<String> lista_de_espera) throws RemoteException {
		// TODO Auto-generated method stub
		VF1_SO_BFTCliente cliente = VF1_SO_BFTCliente.getCliente();
		cliente.getTela_espera().getEspera().receberListaEspera(lista_de_espera);

	}

}
